package a11_Network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.nio.charset.StandardCharsets;

/**
 * @Author quan
 * @Description UDP回显服务器
 * @Date 2023/5/29 17:13
 */
public class UDPEchoServer {
    //定义一个用于服务器端的DatagramSocket
    private DatagramSocket server;
    /**
     * 构造方法:完成服务器的初始化
     * @param port
     */
    public UDPEchoServer(int port) throws Exception {
        //1、如果端口不合法，则提示错误
        if(port < 1024 || port>65535){
            throw new Exception("端口号必须在1024-65535之间");
        }
        //2、初始化服务器端的UDP服务
        this.server = new DatagramSocket(port);
    }

    /**
     * 服务器接收发来的消息
     */
    public void serverStart() throws IOException {
        System.out.println("服务器已经启动");
        //循环接收用户请求
        while (true){
            /**
             * 接收客户端发来的数据：创建DatagramPacket里面用来存放的接收来的消息体-> receive接收DatagramPacket ->解析数据
             */
            //1、创建一个用于接收请求数据的DatagramPacket
            DatagramPacket requestPacket = new DatagramPacket(new byte[1024], 1024);
            //2、接收请求，将真实的内容填充到requestPacket
            server.receive(requestPacket);
            //3、从requestPacket中获取数据
            String request = new String(requestPacket.getData(),0,requestPacket.getLength(),"UTF-8");
            //4、根据获取到的请求发出响应
            String respond = processor(request);
            /**
             * 发送响应：也要进行数据的封装
             */
            //5、将发出的响应也封装到DatagramPacket中:requestPacket.getSocketAddress()是从请求中获取到的IP地址
            DatagramPacket respondPacket = new DatagramPacket(respond.getBytes(StandardCharsets.UTF_8),respond.getBytes().length,requestPacket.getSocketAddress());
            //6、发送数据
            server.send(respondPacket);
            //打印日志
            System.out.printf("[%s:%d] request: %s,respond: %s.\n",
                    requestPacket.getAddress().toString(),
                    requestPacket.getPort(),
                    request,
                    respond);
        }
    }
    /**
     * 服务器对发来的消息做出反应
     * @param request
     * @return
     */
    public String processor(String request) {
        return request;
    }

    public static void main(String[] args) throws Exception {
        UDPEchoServer server = new UDPEchoServer(9999);
        server.serverStart();
    }
}
